数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


求全局最优解

问题

求下列函数的最大值: $$ f(x)=\left(1-x^{3}\right) \sin (3 x),-2 \pi \leq x \leq 2 \pi . $$

求解

为了便于理解, 先做图, 可见, 函数在 $-6$ 和 6 附近达到最大值, 最大值接近 195。如果使用优化命令 fminbound 求解, 只能求得局部极大 点 $x=-3.7505$, 对应的局部极大值为 $y=52.0046$ 。显然结果是错误的, 原因是 fminbound 容易陷入局部极值, 这也是许多优化算法难以克服的一个困 难。 用随机模拟的方法,就是随机产生若干个自变量的值来搜索,例如取100个点,求得的最大值在194附近,结果要好得多。

代码

import numpy as np
from matplotlib.pyplot import rc, plot, show
from scipy.optimize import fminbound, fmin
rc('font',size=16)
fx=lambda x:(1-x**3)*np.sin(3*x);
x0=np.linspace(-2*np.pi,2*np.pi,100);
y0=fx(x0); plot(x0,y0); show()
xm1=fminbound(lambda x:-fx(x),-2*np.pi,2*np.pi)
ym1=fx(xm1); print(xm1,ym1,'\n--------------')
xm2=fmin(lambda x:-fx(x), -2*np.pi)
ym2=fx(xm2); print(xm2,ym2,'\n--------------')
x=np.random.uniform(-2*np.pi,2*np.pi,100)
y=fx(x); ym=y.max()
xm=x[y==ym]; print(xm,ym)